﻿#pragma once
#include <iostream>
#include <string>
#include <cassert>
using namespace std;
class CMatrix
{
public:
	//默认构造函数
	CMatrix(void);
	//构造函数一
	CMatrix(int row, int column);
	//复制构造函数
	CMatrix(const CMatrix& m);
public:
	//默认析构函数
	~CMatrix(void);
public: //运算符
//赋值运算符
	CMatrix& operator=(const CMatrix& m);
	//比较运算符
	bool operator==(const CMatrix& m);
	bool operator!=(const CMatrix& in);
	//加/减运算符
	CMatrix operator + (const CMatrix& m);
	CMatrix operator -(const CMatrix& m);
	//自加/减运算符
	CMatrix& operator+=(const CMatrix& m);
	CMatrix& operator-=(const CMatrix& m);
	//下标运算符重载
	double*& operator[] (int row)
	{
		assert(row < _row);
		return _A [ row ] ;
	}
	//单目运算符
	CMatrix operator-(); // 取负数
	//乘法运算符
	CMatrix operator*(const CMatrix& m);
	CMatrix operator*(const double& s);
	friend std::ostream& operator<<(std::ostream& os, CMatrix& m)
	{
		for (int i = 0; i < m.getRow(); ++i)
		{
			for (int j = 0; j < m.getColumn(); ++j)
			{
				if (j == 0)
					os << m.getValue(i, j);
				else
					os << " " << m.getValue(i, j);
			}
			os << endl;
		}
		return os;
	}
public: //属性变量
//设置(ij)的值
	void setValue(int row, int column, double value) {_A[row][column] = value;}
double getValue(int row, int column) const { return _A[row][column]; }
//设置行、列的值
void setRow(const int row) {_row = _row; }
int getRow() const { return _row; }
void setColunm(const int column) { _column = column; }
int getColumn() const { return _column; }
//设置单位阵
bool setUnitMatrix();
public:
	//矩阵转置
	CMatrix transpose();
	//矩阵求逆
	CMatrix inverse(); // 列主元素法
private: //成员变量
	double** _A;
	int _row;	// 行
	int _column;	// 列
	};
